#include<iostream>
#include<string>
#include<cerrno>
#include<sys/socket.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>


void Usage(std::string proc)
{
  std::cout<<"Usage: \n\t"<<proc<<std::endl;
}

/*./Udp_client id port*/
int main(int argc,char* argv[])
{
  if(argc!=3)
  {
    Usage(argv[0]);
    return 0;
  }

  //socket(协议域，协议类型，0);
  //创建套接字，打开网络文件
  int sock = socket(AF_INET,SOCK_DGRAM,0);
  if(sock<0)
  {
    std::cerr<<"socket err: "<<errno<<std::endl;
    return -1;
  }

  struct sockaddr_in server;//用于接收来自服务器的各种信息
  server.sin_family = AF_INET;//地址族，跟socket中的协议域一样，AF_INET为IPV4，AF_INET6为IPV6
  server.sin_port = htons(atoi(argv[2]));//先将端口号转化为整型，然后转化为网络序列
  server.sin_addr.s_addr=inet_addr(argv[1]);//inet_addr是将用于将点分十进制形式的IP地址转换为网络字节序的32位二进制IP地址

  //使用服务
  while(1)
  {
    std::string message;//数据从键盘输入
    std::cout<<"请输入数据# ";
    std::cin>>message;

    sendto(sock,message.c_str(),message.size(),0,(struct sockaddr*)&server,sizeof(server));

    struct sockaddr_in tmp;
    socklen_t len = sizeof(tmp);
    char buffer[1024];
    recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&tmp,&len);
    std::cout<<"server echo# "<<buffer<<std::endl;
  }
  return 0;
}
